package com.zw.a.basic.a13.demo14_model;

//奶箱类(Box)：定义一个成员变量，表示第x瓶奶，提供存储牛奶和获取牛奶的操作
public class Box {
    //定义一个成员变量，表示第x瓶奶，
    private int milk;

    //定义一个成员变量, 记录奶箱的状态
    private boolean state = false;      //true: 有奶,   false: 没奶.

    //提供存储牛奶的操作
    public synchronized void put(int milk) {     //5
        //如果有牛奶, 就等待消费者消费
        if (state) {
            try {
                wait();     //让线程处于等待状态, 必须被唤醒, 线程才能继续执行.
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //正常的放入牛奶的动作.
        this.milk = milk;
        System.out.println("送奶工将第" + milk + "瓶奶放入奶箱");

        //走到这里, 说明牛奶放入了, 需要修改奶箱的状态.
        state = true;

        //核心: 唤醒消费者, 提示他来消费.
        //notifyAll();
        notify();
    }

    //获取牛奶的操作
    public synchronized void get() {
        //没有牛奶, 就等待生产.
        if (!state) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        //具体的获取牛奶的操作.
        System.out.println("用户拿到第"+ milk +"瓶牛奶");

        //消费完毕之后, 需要修改奶箱状态
        state = false;

        //核心: 唤醒生产者, 提示他来生产.
        //notifyAll();
        notify();
    }
}
